import pymysql
# 用来连接数据库的
# 第一步：建立链接
# 思考一下，之前链接数据库需要哪些？
# user：账号
# password：密码
# host：ip地址
# port：端口号，默认3306，不写就是3306
# database：数据库
# cursorclass = pymysql.cursors.DictCursor ，控制返回的内容为字典。不加这个参数，默认是元组返回
"""
obj = pymysql.connect(user='root',password='123456',database='jiac',host='47.104.65.165',cursorclass = pymysql.cursors.DictCursor)
cursor = obj.cursor() # 游标，一旦对数据库增删改查了，都需要游标提交
# 查：通过游标读取数据
cursor.execute("select * from student where name='随时'") # 表里符合条件是两条
print(cursor.fetchone()) # 根据查询条件，只是查询一条数据

cursor.execute('select * from student where name = "随时"')
print(cursor.fetchall()) # 查到符合条件的全部数据

# 增
try:
    cursor.execute("insert into student(names) values('张三')")
    obj.commit() # 如果是对数据库做了真实的改变，需要用数据库对象提交一下
except:
    obj.rollback() # 回滚

# 改
cursor.execute('update student set name="张四" where name="张三"')
obj.commit()

# 删
cursor.execute('delete from student where name="张四"')
obj.commit()

cursor.execute('select * from student ')
print(cursor.fetchall()) # 查到符合条件的全部数据

# 关闭资源
cursor.close()
obj.close()
"""
import pymysql
class DB:
    def __init__(self,user,password,host,database,port=3306,cursorclass=None):
        """
        :param user: 账号
        :param password:密码
        :param host: ip地址
        :param database:  数据库名称
        :param port: 端口号
        :param cursorclass: 控制返回对象为字典
        """
        self.user = user
        self.password = password
        self.port=port
        self.database = database
        self.host = host
        if cursorclass == None:
            self.cursorclass = pymysql.cursors.DictCursor
        else:
            self.cursorclass = cursorclass
    def connect(self):
        self.db = pymysql.connect(user=self.user,password=self.password,database=self.database,host=self.host,cursorclass = self.cursorclass,port=self.port)
        self.cursor = self.db.cursor() # 创建游标对象
    def close(self):
        """
        关闭资源
        """
        self.cursor.close()
        self.db.close()
    # 查一条
    def search_one(self,sql):
        """
        :param sql: 传入查询sql
        :return:  符合一条的数据
        """
        self.connect()
        try:

            self.cursor.execute(sql)
            result = self.cursor.fetchone()

        except:
            self.db.rollback() # 如果报错了，就回滚一下
            result = "sql error"
        self.close()
        return result
    # 查全部
    def search_all(self,sql):
        """
        :param sql: 传入查询sql
        :return:  符合一条的数据
        """
        self.connect()
        try:

            self.cursor.execute(sql)
            result = self.cursor.fetchall()
        except:
            self.db.rollback() # 如果报错了，就回滚一下
            result = "sql error"
        self.close()
        return result
    # 增删改
    def __edit(self,sql):
        # __叫做私有方法，外部没有办法直接调用的，需要通过其他的类方法间接引用
        """
        :param sql: 传入增删改sql
        :return:
        """
        self.connect()
        try:

            self.cursor.execute(sql)
            self.db.commit()
            self.close()
            return 1
        except:
            self.db.rollback()
            self.close()
            return 0

    def insert(self,sql):
        return self.__edit(sql)
    def delete(self,sql):
        return self.__edit(sql)
    def update(self,sql):
        return self.__edit(sql)



if __name__ == '__main__': # 主程序执行入口
    db1 = DB(user='root',password='123456',host='47.104.65.165',database='jiac')
    # 查询调用方法
    print(db1.search_all('select * from student'))
    # 修改调用方法
    db1.update('update student set name="吃饭" where name="随时"')
    # 再去查一下是否真的改掉了
    print(db1.search_all('select * from student'))
    # 删除调用
    db1.delete('delete from student where name="吃饭"')
    # 再去查一下是否真的删除了
    print(db1.search_all('select * from student'))















